#include <iostream>
#include "map"

using namespace std;

/*
 * map/multimap容器       关联式容器，使用二叉树实现
 *      map中所有元素都是pair
 *      pair中第一个元素为key，索引作用，第二个元素为value，值
 *      所有元素会根据元素的键值进行自动排序
 *  区别
 *      map不允许有重复的key值元素
 *      multimap允许有重复的key值元素
 *  构造
 *      map<Type, Type> mp;     默认构造函数
 *      map<Type, Type>(const map & mp)     拷贝构造函数
 *  赋值
 *      map & operator=(const map & mp)     重载等号
 *  大小和交换
 *      size()    返回容器中元素的数量
 *      empty()     判断容器是否为空
 *      swap(st)    交换两个集合容器
 *   插入和删除
 *      insert(elem)    插入元素  m[key] = value
 *      clear()     清除所有元素
 *      erase(pos)  删除pos迭代器所指的元素，返回下一个元素的迭代器
 *      erase(m.begin(), m.end())   将[m.begin(), m.end())之间的元素删除，返回下一个元素的迭代器
 *      erase(key)      删除容器中值为key的元素
 *   查找和统计
 *      find(key)   查找key是否存在，若存在，返回key对应的迭代器，若不存在，返回m.end()
 *      count(key)  统计key的元素个数
 */

class MyCompare{
public:
    bool operator()(int v1, int v2){
        return v1 > v2;
    }
};

void MyPrint(map<int, int> & m){
    for (map<int, int>::iterator it= m.begin(); it!= m.end(); ++it) {
        cout << "key= " << (*it).first << ", value= " << it->second << endl;
    }
}

void test01(){
    map<int, int> m;
    m.insert(pair<int, int>(3, 30));
    m.insert(pair<int, int>(2, 20));
    m.insert(pair<int, int>(4, 40));
    m.insert(pair<int, int>(1, 10));
    MyPrint(m);

    map<int, int, MyCompare> m2;   // 类似set，在创建时可以指定排序方式
}

int main() {

    test01();

    return 0;
}
